import axios from 'axios'
import type { AxiosRequestConfig, AxiosResponse } from 'axios'

const instance = axios.create({
  baseURL: import.meta.env.VITE_API_BASEPATH, // 基础服务端路径
  timeout: 50000 // 请求超时时间
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么，比如添加认证信息等
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做些什么，比如统一处理错误信息等
    return response
  },
  (error) => {
    // 对响应错误做些什么
    return Promise.reject(error)
  }
)

interface CustomAxiosRequestConfig<T> extends AxiosRequestConfig {
  headersType?: string
}

// 封装请求函数
const request = <T>(option: CustomAxiosRequestConfig<T>): Promise<AxiosResponse<T>> => {
  const { url, method, params, data, headersType, responseType } = option
  return instance({
    url: url,
    method,
    params,
    data,
    responseType: responseType,
    headers: {
      'Content-Type': headersType || 'application/json'
    }
  })
}

// 封装restful请求
function getFn<T = any>(option: CustomAxiosRequestConfig<T>): Promise<AxiosResponse<ApiResult<T>>> {
  return request<T>({ method: 'get', ...option })
}

function postFn<T = any>(
  option: CustomAxiosRequestConfig<T>
): Promise<AxiosResponse<ApiResult<T>>> {
  return request<T>({ method: 'post', ...option })
}

function putFn<T = any>(option: CustomAxiosRequestConfig<T>): Promise<AxiosResponse<T>> {
  return request<T>({ method: 'put', ...option })
}

function deleteFn<T = any>(option: CustomAxiosRequestConfig<T>): Promise<AxiosResponse<T>> {
  return request<T>({ method: 'delete', ...option })
}

// 统一导出变量
const useAxios = () => {
  return {
    get: getFn,
    post: postFn,
    delete: deleteFn,
    put: putFn
  }
}

export { useAxios }
